perm filename SEARCH.LSP[206,LSP] blob sn#381614 filedate 1978-09-20 generic text, type C, neo UTF8
COMMENT āŠ—   VALID 00004 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	see GRAPH.LSP for graph search apllications of all types
C00003 00003	Depthfirst search functions
C00005 00004	 breadth first search functions
C00008 ENDMK
CāŠ—;
;;;see GRAPH.LSP for graph search apllications of all types
;;;see INSANI.LSP INSANB.LSP for insanity game application of SEARCH
;;;see CSGREC for context sensitive grammar recognizer use of BSEARCH


(DEFPROP SEARCH '(
	SEARCH
	SEARCHLIS
	ALLSOL1
	ALLSOL
	ALLSOLA
	ALLSOLB
	DEPTHFIRST
	DEPTHFIRST2
	BSEARCH
	BS
	BSL
	BREADTHFIRST
	BREADTHACROSS
	BACKUP
)SEARCHFNS)

;;;Depthfirst search functions



(DEFUN SEARCH (P) (COND ((LOSE P) 'LOSE) ((TER P) P) (T (SEARCHLIS (SUCCESSORS P)))))

(DEFUN SEARCHLIS (U) (COND ((NULL U) 'LOSE) (T ((LAMBDA (X) (COND ((EQ X 'LOSE)
(SEARCHLIS (CDR U))) (T X))) (SEARCH (CAR U))))))

(DEFUN ALLSOL1 (P) (COND ((LOSE P) NIL)
		((TER P) (LIST P))
		(T (MAPAPP (FUNCTION ALLSOL1) (SUCCESSORS P)))))

(DEFUN ALLSOL (P) (ALLSOLA P NIL))

(DEFUN ALLSOLA (P FOUND) (COND
	((LOSE P) FOUND)
	((TER P) (CONS P FOUND))
	(T (ALLSOLB (SUCCESSORS P) FOUND))))

(DEFUN ALLSOLB (U FOUND) (COND
	((NULL U) FOUND)
	(T (ALLSOLB (CDR U) (ALLSOLA (CAR U) FOUND)))))

;;;DEPTHFIRST with cutoff level  returns list of positions leading to winning
;;;position

(DEFUN DEPTHFIRST (S N)
  (COND ((LESSP N 0) NIL)
	((ISWIN S) (NCONS N))
	(T (DEPTHFIRST2 (SUCCESSORS S) N)))) 

(DEFUN DEPTHFIRST2 (Z N)
  (COND ((NULL Z) NIL)
	(T ((LAMBDA (Q) 
	      (COND ((NULL Q) (DEPTHFIRST2 (CDR Z) N))
		    (T (CONS (CAR Z) Q)))) 
            (DEPTHFIRST (CAR Z) (SUB1 N)) )) ))

;;; breadth first search functions

;;;BSEARCH uses simple fifo queue to keep track of what to do next.
(DEFUN BSEARCH (P0) (BS P0 NIL))

(DEFUN BS (P QU) 
  (COND ((ISWIN P) P) 
	((LOSING P) (BSL QU))
	(T (BSL (APPEND QU (SUCCESSORS P)))) ))

(DEFUN BSL (QU) (COND ((NULL QU) 'YOU_LOSE) (T (BS (CAR QU) (CDR QU))) ))


;;;Positions are atomic, path from to to current position is obtained
;;;	by chaining back via "daddy" property.  

(DEFUN BREADTHFIRST (S)
  (PROG (A ANS Z ZNOW ZNEXT)
	(COND ((ISWIN S) (RETURN (NCONS S))))
	(SETQ A S)
	(SETQ ZNOW (SETQ ZNEXT NIL))
L	(SETQ Z (SUCCESSORS A))
        (SETQ ANS (BREADTHACROSS Z A))
	(COND (ANS (RETURN ANS)))
	(SETQ ZNEXT (APPEND ZNEXT Z))
	(COND ((NULL ZNOW) (SETQ ZNOW ZNEXT) (SETQ ZNEXT NIL)))
	(COND ((NULL ZNOW)(RETURN NIL)))
	(SETQ A (CAR ZNOW))
	(SETQ ZNOW (CDR ZNOW))
	(GO L)))

(DEFUN BREADTHACROSS (Z DAD)
  (PROG (A ZZ)
	(SETQ ZZ Z)
    ACROSS
	(COND ((NULL ZZ) (RETURN NIL)) )
        (SETQ A (CAR ZZ))
	(OR (GET A (QUOTE DADDY)) (PUTPROP A DAD (QUOTE DADDY)))
	(COND ((ISWIN A) (RETURN (BACKUP A))) )
	(SETQ ZZ (CDR ZZ))
	(GO ACROSS) ))

(DEFUN BACKUP (Z)
  (PROG (PATH ZZ)
	(SETQ PATH (NCONS Z))
	(SETQ ZZ (GET Z (QUOTE DADDY)))
    BACK
	(COND ((NULL ZZ) (RETURN PATH)))
	(SETQ PATH (CONS ZZ PATH))
	(SETQ ZZ (GET ZZ (QUOTE DADDY)))
	(GO BACK) ))